<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //一.Set(array)和Map(object)结构
    //1.数据结构：数组,自定义的对象  es6新增(Set结构,Map结构)
    //2.为什么增加两种结构

    //二.Set结构
    // ES6提供了数据结构Set. 它类似于数组，但是成员的值都是唯一的，没有重复的值。
    // Set 本身是一个构造函数，用来生成 Set 数据结构，数组作为参数。
    // let s1 = new Set(['applie', 'zhangsan', 100, 200, 300, 'applie', 'zhangsan', 100, 200, 300]);
    // console.log(s1); //{'applie', 'zhangsan', 100, 200, 300}

    // 数组去重 - 扩展运算符依然值set数据结构
    // let arr = ['applie', 'zhangsan', 100, 200, 300, 'applie', 'zhangsan', 100, 200, 300];
    // console.log([...new Set(arr)]); //["applie", "zhangsan", 100, 200, 300]

    // Set结构的属性和方法
    // let s1 = new Set(['zhangsan', 'lisi']); //s1:set对象
    // 长度属性：size
    // console.log(s1.size); //2
    // add():添加一个数据，返回Set结构本身，允许进行链式操作
    // s1.add('wangwu').add('apple').add('orange');
    // delete(value) 删除指定数据，返回一个布尔值，表示删除是否成功。
    // s1.delete('zhangsan');
    // has(value) 判断该值是否为Set的成员，返回一个布尔值。
    // console.log(s1.has('orange')); //true
    // console.log(s1.has('pear')); //false
    // clear() 清除所有的数据， 没有返回值。
    // s1.clear();
    // forEach()： 使用回调函数遍历每个成员
    // s1.forEach((value, index, set) => {
    //     console.log(value, index, set);
    // });
    // console.log(s1);


    // 三.map结构
    // JavaScript的对象（Object）,只能用字符串当作键。这给它的使用带来了很大的限制。ES6 提供了 Map 数据结构。它类似于对象，但是“键”的范围不限于字符串，各种类型的值（包括对象）都可以当作键。
    // 参数类似于二维数组。
    let obj = {
        a: 1,
        b: 2,
        c: 3
    };
    let m1 = new Map([
        [true, 1],
        [false, 2],
        [{}, 3],
        [function() {}, 4],
        [undefined, 5],
        [null, 6]
    ]);


    // console.log(m1.size); //6

    // map.set(key,value) :设置键名key对应的键值value,然后返回整个map结构，如	果key已经有值，则键值会被更新，否则就生成该键，可以链式操作。
    m1.set([], 7).set('name', 'zhangsan').set(1, 8);
    // map.get(key) get方法读取key对应的键值，如果找不到key，返回undefined
    // console.log(m1.get(1)); //8
    // console.log(m1.get(null));//6
    // console.log(m1.get(undefined));//5
    // console.log(m1.get([]));//undefined   console.log([]==[]);//false
    // map.delete(key) 删除某个键，返回true.如果删除失败，返回false.
    // console.log(m1.delete(null));
    // console.log(m1.delete([]));
    // map.has(key) 方法返回一个布尔值，表示某个键是否在当前map对象之中。
    // console.log(m1.has('name')); //true
    // map.clear() 清除所有数据，没有返回值
    // m1.clear();
    // map.entries() 返回键值对的遍历器
    // console.log(m1.entries());
    // map.forEach()   使用回调函数遍历每个成员。
    // m1.forEach((value, key) => {
    //     console.log(key, value);
    // });
    // console.log(m1);
</script>